﻿// -------------  Variables Generales -------------------- //
var varCounterTimeOut;
var C_DATE_FMT = 'd/M/y';

// -------------  Funciones Generales -------------------- //
function bandejaModal(url) {
//   var valRet = window.showModalDialog(url, '',
//   'dialogHeight:535px; dialogWidth:725px;' +
//   'edge: Raised; center: Yes; help: No; resizable: No; status: No;');

   var valRet = modalDialog(url, 725, 535)
   return valRet;
}

function modalDialog(url, width, height) {

   var valRet = window.showModalDialog(url, '',
   'dialogHeight: ' + height + 'px; dialogWidth: ' + width + 'px;' +
   'edge: Raised; center: Yes; help: No; resizable: No; status: No;');

   return valRet;
}

function reportWindow(url) {

   var valRet = window.showModalDialog(url, '',
   'dialogHeight:600px; dialogWidth:850px;' +
   'edge: Raised; center: Yes; help: No; resizable: Yes; status: No; maximize: Yes');

   return valRet;
}

function isEmptyControl(id, message) {
   var ctl = document.getElementById(id);
   var blnEmpty = false;

   if (ctl == null) {
      alert('El control <' + id + '> no existe');
      return true;
   }
   switch (ctl.type) {
      case 'text':
      case 'textarea':
      case 'hidden':
      case 'select-one':
         if (ctl.value == '') {
            blnEmpty = true;
            break;
         }
         else {
            switch (ctl.className) {
               case 'esdNumericTextBox':
               case 'esdNumericTextBoxDisabled':
                  var dec = parseFloat(ctl.value);
                  if (dec == null) {
                     blnEmpty = true;
                     break;
                  }
                  else {
                     if (dec == 0) {
                        blnEmpty = true;
                        break;
                     }
                     else {
                        blnEmpty = false;
                        break;
                     }
                  }
                  break;
               default:
                  blnEmpty = false;
            }
         }
         break;
   }

   if (blnEmpty && message != '') {
       alert(message);
       ctl.focus();
   }

   return blnEmpty;
}

function isEmptyGrid(id, message) {

   var grid = document.getElementById(id);

   var intCount = grid.rows.length;
   if (intCount <= 1) {
      if(message != "")
         alert(message);
      return true;
   }

   //Solo si la grilla tiene un emptytemplate
   if (intCount == 2) {
      if (grid.rows[1].cells.length <= 1) {
         if (message != "")
            alert(message);
         return true;
      }
   }

   return false;
}

function internalGridResize(id) {
    setTimeout(function () {
        var tblMB = document.getElementById('masterMainBar');

        var mnuTb = document.getElementById('mnuToolbar');
        if (mnuTb == null)
            mnuTb = document.getElementById('ContentPlaceHolder1_mnuToolbar');

        var mnuTbgrid = document.getElementById('mnuGrid');
        if (mnuTbgrid == null)
            mnuTbgrid = document.getElementById('ContentPlaceHolder1_mnuGrid');


        var tblEdit = document.getElementById('TableDataHeader');
        var grid = document.getElementById(id); // $find(id);

        var intMBH = 0;
        var intTBH = 0;
        var intTBGridH = 0;
        var intEditH = 0;
        var intHDif = 0;

        if (tblMB)
            intMBH = tblMB.offsetHeight;

        if (mnuTb)
            intTBH = mnuTb.offsetHeight;

        if (mnuTbgrid)
            intTBGridH = mnuTbgrid.offsetHeight;

        if (tblEdit)
            intEditH = tblEdit.offsetHeight;


        intHDif = $(document).height() - (intEditH + intMBH + intTBH + intTBGridH + 16);

        var scrollArea = document.getElementById(grid.id + "_ScrollArea");
        if (scrollArea) {
            //            scrollArea.style.height = (scrollArea.offsetHeight + intHDif) + "px";
            scrollArea.style.height = intHDif + "px";
            var gridempy = document.getElementById("gridempty");
            if (gridempy) {
                gridempy.style.height = (intHDif - 55) + "px";
            }

        }
        else {
            grid.style.height = (intHDif - 35) + "px";
        }

    }, 1);

}

function MessageOnPostback() {
   var hdnMsgOPB = $get('ContentPlaceHolder1_hdnMsgOPB');

   if (hdnMsgOPB == null)
      return;

   if (hdnMsgOPB.value.length = 0)
      return;

   var arrComp = hdnMsgOPB.value.split(';');
   hdnMsgOPB.value = '';

   if (arrComp.length < 3)
      return;

   //0 -- Tipo de Mensaje
   //1 -- Mensaje
   alert(arrComp[1]);
   //2 -- URL
   if (arrComp[2] != '')
      location.href = arrComp[2];
}

function isValidDate(val, showMessage) {

   if (val == '' || val == '__/__/____' || val == '__/__/____ __:__')
      return true;
      
   var varRpta = isDate(val.slice(0, 10), C_DATE_FMT);
   if (showMessage & !varRpta) {
      alert('La fecha ingresada no es correcta. Ingresela usando el formato: ' + C_DATE_FMT);
      return false;
   }

   if (parseFloat(val.slice(11, 13)) > 23) {
      alert('La Hora ingresada no es correcta. Debe ser menor a las 23:59 horas.');
      return false;
      }

   return true;

}

function redirectOnSessionTimeout(sessionTimeout) {

   var varFrame = self.parent.window.frames['headerArea'];

   if (varFrame == null)
      return;

   var varTimeOut = varFrame.document.getElementById('hdnTimeOut');

   if (parseInt(varTimeOut.value) != 0)
      clearTimeout(parseInt(varTimeOut.value));

   var loc = self.parent.window.location;
   var pathName = loc.pathname.substring(0, loc.pathname.lastIndexOf('/') + 1);
   var varUrlBase = loc.href.substring(0, loc.href.length - ((loc.pathname + loc.search + loc.hash).length - pathName.length));

   sessionTimeout = (sessionTimeout * 60 * 1000);
   varTimeOut.value = window.setTimeout("self.parent.window.location.href = '" + varUrlBase + "\wfLogout.aspx'", sessionTimeout);
}

function setInputValue(id, newValue) {
   var ctl = document.getElementById(id);
   ctl.value = newValue;
}

function disableControl(id, state) {
   var ctl = document.getElementById(id);
   ctl.disabled = state;
}

function getGridRowByIndex(id, rowIndex) {
   var grid = document.getElementById(id);
   var row;

   if (grid.rows.length == 0)
      return row;

   var isTH = false;
   if (grid.rows[0].cells[0].nodeName == 'TH')
      isTH = true;

   if (isTH)
      row = grid.rows[parseInt(rowIndex) + 1];
   else
      row = grid.rows[parseInt(rowIndex)];

   return row;
}

function disabledMenuItem(id, index) {
   var ctl = document.getElementById(id);
   var menuLinks = ctl.getElementsByTagName("a");
   menuLinks[index].disabled = true;
}

function gridHasCheckedRows(id, col, message) {

   var grid = document.getElementById(id);

   var intCount = grid.rows.length;
   var intCheck = 0;

   for (var intIdx = 0; intIdx < intCount; intIdx++) {
      var objRow = grid.rows[intIdx];
      if (objRow.cells[0].nodeName == 'TD') {
         var objChk = getChildNodeByType(objRow.cells[col].childNodes,'checkbox');
         if (objChk.checked)
            intCheck++;
      }

   }

   if (intCheck == 0) {
      alert(message);
      return false;
   }

   return true;
}

function getChildNodeByType(nodes, key) {
   for (var i = 0; i < nodes.length; i++) {
      if (nodes[i].type != null)
         if (nodes[i].type = key)
            return nodes[i];
   }

   return null;
}

function isArray(obj) {
   if (obj.constructor.toString().indexOf("Array") == -1)
      return false;
   else
      return true;
}

function gridGetRowByCellValue(id, col, value) {
   var grid = document.getElementById(id);

   var intRows = grid.rows.length;

   for (var i = 0; i < intRows; i++) {
      var row = grid.rows[i];
      if (row.cells[0].nodeName == 'TH')
         continue;

      if (isArray(col) && isArray(value)) {
         var varALen = col.length;
         var varF = 0
         for (var j = 0; j < varALen; j++) {
            if (getObjInnerText(row.cells[col[j]]) == value[j])
               varF++;
         }
         if (varF == varALen)
            return row;
      }
      else
         if (getObjInnerText(row.cells[col]) == value)
            return row;
   }

   return null;
}

function gridFindCellValueInRow(id, col, value, message) {

   if (isEmptyGrid(id, '')) {
      return false;
   }

   var row = gridGetRowByCellValue(id,col,value)

   if(row != null) {
      alert(message);
      return true;
      }

   return false;

}

//-- 14-12-2011
function gridFindCellValueInRow_Prev(id, colEstado, colPrecio, message) {

    if (isEmptyGrid(id, '')) {
        return false;
    }

      var row = ValidaPrecio(id, colEstado, colPrecio)
    if (row != null) {
        alert(message);
        return true;
    }

    return false;
}

function ValidaPrecio(id,colEstado,colPrecio) {
    var grid = document.getElementById(id);
    var gridAux = document.getElementById(id);

    var intRows = grid.rows.length;
    for (var i = 0; i < intRows; i++) {
        var row = grid.rows[i];
        if (row.cells[0].nodeName == 'TH')
            continue;

        if (getObjInnerText(row.cells[colEstado]) == '1') //estado 9 
            continue;

        var idPrecioAux = getObjInnerText(row.cells[colPrecio]) //10
        var varf = 0;
        for (var j = 0; j < intRows; j++) {
            var rowAux = gridAux.rows[j];
            if (rowAux.cells[0].nodeName == 'TH')
                continue;

            if (getObjInnerText(rowAux.cells[colEstado]) == '1') // estado 9
                continue;
            
            var preciorowAux = getObjInnerText(rowAux.cells[colPrecio])
            if (getObjInnerText(rowAux.cells[colPrecio]) != idPrecioAux) 
                varf++;
        
        }
        if (varf > '0')
            return row;    
    }

}

function gridFindCellValueInRowNotDisabled(id, col, value, message,stcol) {

   if (isEmptyGrid(id, '')) {
      return false;
   }

   var row = gridGetRowByCellValue(id, col, value)
   if (row != null) {
      if (getObjInnerText(row.cells[stcol]) == 0) {
         alert(message);
         return true;
      }
   }
   return false;
}

function getGridRowCount(id) {

   var grid = document.getElementById(id);

   var intCount = grid.rows.length;
   if (intCount <= 1) {
      return 0;
   }

   //Solo si la grilla tiene un emptytemplate
   if (intCount == 2) {
      if (grid.rows[1].cells.length <= 1) 
         return 0;
   }

   var varTH = 0;
   if (grid.rows[0].cells[0].nodeName == 'TH')
      varTH = 1;

   return intCount - varTH;   
}

function isGridHasAllDeletedRows(id, message, deletedIndex) {

   var grid = document.getElementById(id);
   var intCount = getGridRowCount(id);

   var intRows = grid.rows.length;
   var intRowD = 0;

   for (var i = 0; i < intRows; i++) {
      var row = grid.rows[i];
      if (row.cells[0].nodeName == 'TH')
         continue;

      if (IsGridRowLogicalDeleted(row.cells[deletedIndex]))
         intRowD++;
   }

   if (intRowD == intCount) {
      if(message != '')
         alert(message);
      return true;
   };

   return false;
}

function IsGridRowLogicalDeleted(cell) { 
   
   var varStDel = '1,2'
   if (varStDel.indexOf(getObjInnerText(cell)) < 0)
      return false;

   return true;
}

function getObjInnerText(obj) {

   if (typeof obj.textContent != 'undefined')
      return jQuery.trim(obj.textContent);
   
   return jQuery.trim(obj.innerText);
} 

function resizeheader(grdview, grdviewth) {
   var grd = document.getElementById(grdview);
   var grdheader = document.getElementById(grdviewth);
   grdheader.style.width = parseInt(grd.clientWidth) + "px";
   if (grd.rows[0].cells.length != null) {
      if (grd.rows[0].cells.length > 1) {
         for (i = 0; i < grdheader.rows[0].cells.length; i++) {
            grdheader.rows[0].cells[i].style.width = grd.rows[0].cells[i].clientWidth + "px";
         }
      }
   }

}

function updatePanelAnimationUpdating() {
   // get the update progress div
   var updateProgressDiv = $get('updateProgressDiv');

   // make it visible
   updateProgressDiv.style.display = '';

   // get the bounds of both the gridview and the progress div

   var pageBounds = Sys.UI.DomElement.getBounds(document.documentElement);
   var updateProgressDivBounds = Sys.UI.DomElement.getBounds(updateProgressDiv);

   //  center of gridview
   var x = pageBounds.x + Math.round(pageBounds.width / 2) - Math.round(updateProgressDivBounds.width / 2);
   var y = pageBounds.y + Math.round(pageBounds.height / 2) - Math.round(updateProgressDivBounds.height / 2);

   //    set the progress element to this position
   Sys.UI.DomElement.setLocation(updateProgressDiv, x, y);
}

function updatePanelAnimationUpdated() {
   // get the update progress div
   var updateProgressDiv = $get('updateProgressDiv');
   // make it invisible
   updateProgressDiv.style.display = 'none';
}

function disableBackSpace(event)
{
   if (typeof window.event != 'undefined') { // ie
      event = window.event;
      event.target = event.srcElement; // make ie confirm to standards !!
   }
   var kc = event.keyCode;
   var tt = event.target.type;
   if ((kc == 8)) {
      if (tt == 'text' || tt == 'textarea') {
         var readOnly = event.target.attributes.getNamedItem('readOnly');
         if (readOnly != null) {
            if (readOnly.value == 'true' || readOnly.value == 'readonly')
               return false;
            else
               return true;
         }
         else
            return true;
      }
      else
         return false;
   }
   else
      return true;
}

function disableEnterAndBackSpaceKey(event) {
   var key;
   if (window.event)
      key = window.event.keyCode; //IE
   else
      key = e.which; //firefox

   if (key == 13)
      return false;

   return (disableBackSpace(event));
}

function DateDiff(IntervalType, StartDate, EndDate) {
   var Interval = 0;
   var DevideBy = 1;
   var varDate1 = StartDate;
   var varDate2 = EndDate;

   if (EndDate < StartDate) {
      varDate1 = EndDate
      varDate2 = StartDate
   }

   switch (IntervalType) {
      //date portion   
      case 'd': //add days
         DevideBy = 1000 * 60 * 60 * 24;
         Interval = varDate2 - varDate1;
         Interval = Math.floor(Interval / DevideBy);


         break;
      case 'm': //add months
         var MonthsInFullYear = varDate2.getFullYear() - varDate1.getFullYear();
         if (MonthsInFullYear > 0) {
            MonthsInFullYear = (MonthsInFullYear - 1) * 12;
            Interval = varDate2.getMonth() + (12 - varDate1.getMonth());
            Interval = Interval + MonthsInFullYear
         }
         else {
            Interval = varDate2.getMonth() - varDate2.getMonth();
         }

         break;
      case 'y': //years
         Interval = varDate2.getFullYear() - varDate1.getFullYear();
         break;

      //time portion         
      case 'h': //days
         DevideBy = 1000 * 60 * 60;
         Interval = varDate2 - varDate1;
         Interval = Math.floor(Interval / DevideBy);
         break;
      case 'n': // minutes
         DevideBy = 1000 * 60;
         Interval = varDate2 - varDate1;
         Interval = Math.floor(Interval / DevideBy);
         break;
      case 's': //seconds
         DevideBy = 1000
         Interval = varDate2 - varDate1;
         Interval = Math.floor(Interval / DevideBy);
         break;
   }

   return Interval;
} 

//Retorna solo la Fecha de un dato de tipo DateTime
function TruncateDate(startDate) {
   var datTmp = new Date(startDate);

   return new Date(datTmp.getFullYear(), datTmp.getMonth(), datTmp.getDate());
}

function menu_doPostBack(clientID, uniqueID, key) {
   var mnu = document.getElementById(clientID);
   if (mnu.disabled)
      return false;

   mnu.disabled = true;

   __doPostBack(uniqueID, key);
}
// ------------------------------------------------------------------
//  "Agregado para validaciones"
// ------------------------------------------------------------------

var MONTH_NAMES = new Array('Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre', 'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre');
var DAY_NAMES = new Array('Domingo', 'Lunes', 'Martes', 'Miercoles', 'Jueves', 'Viernes', 'Sabado', 'Domingo', 'Lunes', 'Martes', 'Miercoles', 'Jueves', 'Viernes', 'Sabado');
function LZ(x) { return (x < 0 || x > 9 ? "" : "0") + x }

// ------------------------------------------------------------------
// isDate ( date_string, format_string )
// Returns true if date string matches format of format string and
// is a valid date. Else returns false.
// It is recommended that you trim whitespace around the value before
// passing it to this function, as whitespace is NOT ignored!
// ------------------------------------------------------------------
function isDate(val, format) {
   var date = getDateFromFormat(val, format);
   if (date == 0) { return false; }
   return true;
}

// -------------------------------------------------------------------
// compareDates(date1,date1format,date2,date2format)
//   Compare two date strings to see which is greater.
//   Returns:
//   1 if date1 is greater than date2
//   0 if date2 is greater than date1 of if they are the same
//  -1 if either of the dates is in an invalid format
// -------------------------------------------------------------------
function compareDates(date1, dateformat1, date2, dateformat2) {
   var d1 = getDateFromFormat(date1, dateformat1);
   var d2 = getDateFromFormat(date2, dateformat2);
   if (d1 == 0 || d2 == 0) {
      return -1;
   }
   else if (d1 > d2) {
      return 1;
   }
   return 0;
}

// ------------------------------------------------------------------
// formatDate (date_object, format)
// Returns a date in the output format specified.
// The format string uses the same abbreviations as in getDateFromFormat()
// ------------------------------------------------------------------
function formatDate(date, format) {
   format = format + "";
   var result = "";
   var i_format = 0;
   var c = "";
   var token = "";
   var y = date.getYear() + "";
   var M = date.getMonth() + 1;
   var d = date.getDate();
   var E = date.getDay();
   var H = date.getHours();
   var m = date.getMinutes();
   var s = date.getSeconds();
   var yyyy, yy, MMM, MM, dd, hh, h, mm, ss, ampm, HH, H, KK, K, kk, k;
   // Convert real date parts into formatted versions
   var value = new Object();
   if (y.length < 4) { y = "" + (y - 0 + 1900); }
   value["y"] = "" + y;
   value["yyyy"] = y;
   value["yy"] = y.substring(2, 4);
   value["M"] = M;
   value["MM"] = LZ(M);
   value["MMM"] = MONTH_NAMES[M - 1];
   value["NNN"] = MONTH_NAMES[M + 11];
   value["d"] = d;
   value["dd"] = LZ(d);
   value["E"] = DAY_NAMES[E + 7];
   value["EE"] = DAY_NAMES[E];
   value["H"] = H;
   value["HH"] = LZ(H);
   if (H == 0) { value["h"] = 12; }
   else if (H > 12) { value["h"] = H - 12; }
   else { value["h"] = H; }
   value["hh"] = LZ(value["h"]);
   if (H > 11) { value["K"] = H - 12; } else { value["K"] = H; }
   value["k"] = H + 1;
   value["KK"] = LZ(value["K"]);
   value["kk"] = LZ(value["k"]);
   if (H > 11) { value["a"] = "PM"; }
   else { value["a"] = "AM"; }
   value["m"] = m;
   value["mm"] = LZ(m);
   value["s"] = s;
   value["ss"] = LZ(s);
   while (i_format < format.length) {
      c = format.charAt(i_format);
      token = "";
      while ((format.charAt(i_format) == c) && (i_format < format.length)) {
         token += format.charAt(i_format++);
      }
      if (value[token] != null) { result = result + value[token]; }
      else { result = result + token; }
   }
   return result;
}

// ------------------------------------------------------------------
// Utility functions for parsing in getDateFromFormat()
// ------------------------------------------------------------------
function _isInteger(val) {
   var digits = "1234567890";
   for (var i = 0; i < val.length; i++) {
      if (digits.indexOf(val.charAt(i)) == -1) { return false; }
   }
   return true;
}
function _getInt(str, i, minlength, maxlength) {
   for (var x = maxlength; x >= minlength; x--) {
      var token = str.substring(i, i + x);
      if (token.length < minlength) { return null; }
      if (_isInteger(token)) { return token; }
   }
   return null;
}

// ------------------------------------------------------------------
// getDateFromFormat( date_string , format_string )
//
// This function takes a date string and a format string. It matches
// If the date string matches the format string, it returns the 
// getTime() of the date. If it does not match, it returns 0.
// ------------------------------------------------------------------
function getDateFromFormat(val, format) {
   val = val + "";
   format = format + "";
   var i_val = 0;
   var i_format = 0;
   var c = "";
   var token = "";
   var token2 = "";
   var x, y;
   var now = new Date();
   var year = now.getYear();
   var month = now.getMonth() + 1;
   var date = 1;
   var hh = now.getHours();
   var mm = now.getMinutes();
   var ss = now.getSeconds();
   var ampm = "";

   while (i_format < format.length) {
      // Get next token from format string
      c = format.charAt(i_format);
      token = "";
      while ((format.charAt(i_format) == c) && (i_format < format.length)) {
         token += format.charAt(i_format++);
      }
      // Extract contents of value based on format token
      if (token == "yyyy" || token == "yy" || token == "y") {
         if (token == "yyyy") { x = 4; y = 4; }
         if (token == "yy") { x = 2; y = 2; }
         if (token == "y") { x = 2; y = 4; }
         year = _getInt(val, i_val, x, y);
         if (year == null) { return 0; }
         i_val += year.length;
         if (year.length == 2) {
            if (year > 70) { year = 1900 + (year - 0); }
            else { year = 2000 + (year - 0); }
         }
      }
      else if (token == "MMM" || token == "NNN") {
         month = 0;
         for (var i = 0; i < MONTH_NAMES.length; i++) {
            var month_name = MONTH_NAMES[i];
            if (val.substring(i_val, i_val + month_name.length).toLowerCase() == month_name.toLowerCase()) {
               if (token == "MMM" || (token == "NNN" && i > 11)) {
                  month = i + 1;
                  if (month > 12) { month -= 12; }
                  i_val += month_name.length;
                  break;
               }
            }
         }
         if ((month < 1) || (month > 12)) { return 0; }
      }
      else if (token == "EE" || token == "E") {
         for (var i = 0; i < DAY_NAMES.length; i++) {
            var day_name = DAY_NAMES[i];
            if (val.substring(i_val, i_val + day_name.length).toLowerCase() == day_name.toLowerCase()) {
               i_val += day_name.length;
               break;
            }
         }
      }
      else if (token == "MM" || token == "M") {
         month = _getInt(val, i_val, token.length, 2);
         if (month == null || (month < 1) || (month > 12)) { return 0; }
         i_val += month.length;
      }
      else if (token == "dd" || token == "d") {
         date = _getInt(val, i_val, token.length, 2);
         if (date == null || (date < 1) || (date > 31)) { return 0; }
         i_val += date.length;
      }
      else if (token == "hh" || token == "h") {
         hh = _getInt(val, i_val, token.length, 2);
         if (hh == null || (hh < 1) || (hh > 12)) { return 0; }
         i_val += hh.length;
      }
      else if (token == "HH" || token == "H") {
         hh = _getInt(val, i_val, token.length, 2);
         if (hh == null || (hh < 0) || (hh > 23)) { return 0; }
         i_val += hh.length;
      }
      else if (token == "KK" || token == "K") {
         hh = _getInt(val, i_val, token.length, 2);
         if (hh == null || (hh < 0) || (hh > 11)) { return 0; }
         i_val += hh.length;
      }
      else if (token == "kk" || token == "k") {
         hh = _getInt(val, i_val, token.length, 2);
         if (hh == null || (hh < 1) || (hh > 24)) { return 0; }
         i_val += hh.length; hh--;
      }
      else if (token == "mm" || token == "m") {
         mm = _getInt(val, i_val, token.length, 2);
         if (mm == null || (mm < 0) || (mm > 59)) { return 0; }
         i_val += mm.length;
      }
      else if (token == "ss" || token == "s") {
         ss = _getInt(val, i_val, token.length, 2);
         if (ss == null || (ss < 0) || (ss > 59)) { return 0; }
         i_val += ss.length;
      }
      else if (token == "a") {
         if (val.substring(i_val, i_val + 2).toLowerCase() == "am") { ampm = "AM"; }
         else if (val.substring(i_val, i_val + 2).toLowerCase() == "pm") { ampm = "PM"; }
         else { return 0; }
         i_val += 2;
      }
      else {
         if (val.substring(i_val, i_val + token.length) != token) { return 0; }
         else { i_val += token.length; }
      }
   }
   // If there are any trailing characters left in the value, it doesn't match
   if (i_val != val.length) { return 0; }
   // Is date valid for month?
   if (month == 2) {
      // Check for leap year
      if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) { // leap year
         if (date > 29) { return 0; }
      }
      else { if (date > 28) { return 0; } }
   }
   if ((month == 4) || (month == 6) || (month == 9) || (month == 11)) {
      if (date > 30) { return 0; }
   }
   // Correct hours value
   if (hh < 12 && ampm == "PM") { hh = hh - 0 + 12; }
   else if (hh > 11 && ampm == "AM") { hh -= 12; }
   var newdate = new Date(year, month - 1, date, hh, mm, ss);
   return newdate.getTime();
}

// ------------------------------------------------------------------
// parseDate( date_string [, prefer_euro_format] )
//
// This function takes a date string and tries to match it to a
// number of possible date formats to get the value. It will try to
// match against the following international formats, in this order:
// y-M-d   MMM d, y   MMM d,y   y-MMM-d   d-MMM-y  MMM d
// M/d/y   M-d-y      M.d.y     MMM-d     M/d      M-d
// d/M/y   d-M-y      d.M.y     d-MMM     d/M      d-M
// A second argument may be passed to instruct the method to search
// for formats like d/M/y (european format) before M/d/y (American).
// Returns a Date object or null if no patterns match.
// ------------------------------------------------------------------
function parseDate(val) {
   var preferEuro = (arguments.length == 2) ? arguments[1] : false;
   generalFormats = new Array('y-M-d', 'MMM d, y', 'MMM d,y', 'y-MMM-d', 'd-MMM-y', 'MMM d');
   monthFirst = new Array('M/d/y', 'M-d-y', 'M.d.y', 'MMM-d', 'M/d', 'M-d');
   dateFirst = new Array('d/M/y', 'd-M-y', 'd.M.y', 'd-MMM', 'd/M', 'd-M');
   var checkList = new Array('generalFormats', preferEuro ? 'dateFirst' : 'monthFirst', preferEuro ? 'monthFirst' : 'dateFirst');
   var d = null;
   for (var i = 0; i < checkList.length; i++) {
      var l = window[checkList[i]];
      for (var j = 0; j < l.length; j++) {
         d = getDateFromFormat(val, l[j]);
         if (d != 0) { return new Date(d); }
      }
   }
   return null;
}